home *** CD-ROM | disk | FTP | other *** search
/ A.C.E. 2 / ACE CD 2.iso / FILES / UTILS / AMOS3.DMS / AMOS3.adf / Extensions / Music.s < prev    next >
Text File  |  1978-10-10  |  43KB  |  2,055 lines

  1.  
  2.         Include    "Equ.s"
  3. Translate    equ -30
  4.  
  5. ******************************************************************
  6. *     **  *    * **** ****    ***    **  **** ***  ***
  7. *     *  * **  ** *  * *       *  *  *  * *     *  *
  8. *     **** * ** * *  * ****    ****  **** ****  *  *
  9. *     *  * *    * *  *    *    *   * *  *    *  *  *  
  10. *     *  * *    * **** ****    ****  *  * **** ***  ***
  11. ******************************************************************
  12. *
  13. *     AMOS MUSICAL ROUTINES
  14. *
  15. *    Version 1.1
  16. *    By Francois Lionet
  17. *    AMOS (c) Mandarin / Jawx 1990
  18. *
  19. *    This source code is public domain
  20. *
  21. ******************************************************************
  22. *
  23. *    Here is the main AMOS extension. It includes all music
  24. * instructions, and is a perfect example of how to create a
  25. * extension for AMOS.
  26. *     It has been assembled with GENAM2.
  27. *
  28. *    This code is certainely not perfect, some parts may seem to
  29. * you improvable, and sure are! If you make changes to it, be sure
  30. * keep compatibility with the previous version. Create a version for
  31. * each new change so that AMOS music extension don`t become a
  32. * jungle!
  33. *    Some labels may look rather French to you, but sorry, it is
  34. * my native language!
  35. *    
  36. *    When you program an extension, try to program it in RELATIVE
  37. * code, using adress register and index. The COMPILER will only
  38. * accept relative code.
  39. *
  40. *    Thanks to Andreas Tadic, the author of GMC for inspiration in 
  41. * some parts of the music routine...
  42. *
  43. ******************************************************************
  44.  
  45. ******************************************************************
  46. *    AMOS INTERFACE
  47.  
  48. *******    COLD START
  49. *    This must be at the beginning of your program!
  50. *    It is called just after loading...
  51. *
  52. * On Entry:
  53. *    A0=    Branch table
  54. *    A1=    Current intuition.library base
  55. *    A2=    Current graphic.library base
  56. *    A3=    Current diskfont.library base
  57. *    A5=    AMOS data zone address
  58. * You must return
  59. *    A0=    Token table
  60. *    A1=    Welcome message
  61. *    A2=    Routine called by screen reset
  62. *    A3=    Routine called on Quit
  63. *    D0=    False/true-> ERROR
  64. *    D1=    Number of extension. This number MUST be the same
  65. *        than the extension number in the extension list
  66. *    D2=    Address of a routine called each time a memory bank
  67. *        has been changed, zero if not to be called
  68. *
  69. *    If D1<>number of extension or D0=true, AMOS does not load!
  70. *
  71.     movem.l    a4-a6,-(sp)
  72.  
  73. *    If AMOS data zone, stands 8 long words allowing you to simply
  74. *    put a patch in the VBL interrupt. The first on is at VBLRout.
  75. *    At each VBL, AMOS explores this list, and call all address <> 0
  76. *    It stops at the FIRST zero. The music patch is the first routine
  77. *     called.
  78.     lea    MusInt(pc),a1        * Interrupt routine
  79.     move.l    a1,VBLRout(a5)        * Branch
  80.     lea    MusAdr(pc),a1
  81.     move.l    a0,(a1)            * Store address of BRANCH TABLE
  82.     lea    MB(pc),a3        * Base of music parameters
  83.     lea    BkCheck(pc),a0        * Address of CHECK MUSIC BANK
  84.     move.l    a0,d2
  85.     lea    AdMB(pc),a1
  86.     move.l    a3,(a1)
  87.     lea    Tk(pc),a0        * Address of TOKEN TABLE
  88.     lea    MusWel(pc),a1        * Address of WELCOME MESSAGE
  89.     lea    MusDef(pc),a2        * Address of SCREEN RESET
  90.     lea    MusEnd(pc),a3        * Address of QUIT
  91.     moveq    #0,d1            * Returns NUMBER OF EXTENSION
  92.     movem.l    (sp)+,a4-a6
  93.     moveq    #0,d0            * NO ERRORS
  94.     rts
  95.  
  96. ******* SCREEN RESET
  97. *    Each time a DEFAULT occurs, this routine is called. If you
  98. *    do not want any effect, make it point to a RTS
  99. MusDef:    
  100.     lea    MB(pc),a3
  101. * Init narrator
  102.     bsr    NarInit
  103. * Init musique
  104.     bsr    RazWave            * Reset waves
  105.     move.l    Buffer(a5),a0        * Draw square wave
  106.     move.l    a0,a1
  107.     moveq    #127,d0
  108. MuDf1    move.b    #-127,128(a0)
  109.     move.b    #127,(a0)+
  110.     dbra    d0,MuDf1
  111.     moveq    #0,d1            * 0-> Noise
  112.     bsr    NeWave
  113.     moveq    #1,d1            * 1-> Square wave
  114.     bsr    NeWave
  115.     move.w    #LNoise/2-1,d2        * Draw first noise
  116.     move.w    BSeed-MB(a3),d1
  117.     move.l    WaveBase-MB(a3),a0
  118.     lea    WaveDeb(a0),a0
  119. MuDf2    add.w    Circuits+6,d1
  120.     mulu    #$3171,d1
  121.     lsr.l    #8,d1
  122.     move.w    d1,(a0)+
  123.     dbra    d2,MuDf2
  124.     move.w    d1,BSeed-MB(a3)
  125.     moveq    #56,d0            * Default settings
  126.     moveq    #%1111,d1
  127.     bsr    Vol
  128.     bsr    MVol
  129.     move.w    #5,SamBank-MB(a3)    * Sample bank=5    
  130.     moveq    #0,d0            * Sam loop off
  131.     moveq    #-1,d1
  132.     bsr    SL0
  133.     bsr    MuInit
  134.     rts
  135.  
  136. ******* QUIT
  137. *    Here you should restore everything to normal, close
  138. *    all opened libraries, give all reserved memory back to
  139. *    the system...
  140. MusEnd:    lea    MB(pc),a3
  141. * Plus de routine VBL
  142.     clr.l    VBLRout(a5)        * No more routine
  143. * End narrator (if there)
  144.     tst.l    TranBase-MB(a3)
  145.     beq.s    NarEnd
  146.     lea    WriteRep-MB(a3),a1
  147.     move.l    $4,a6
  148.     jsr    RemPort(a6)
  149.     lea    TalkIO-MB(a3),a1
  150.     jsr    CloseDev(a6)
  151.     move.l    TranBase-MB(a3),a1
  152.     jsr    CloseLib(a6)
  153. * End music
  154. NarEnd    bsr    MOff
  155.     moveq    #%1111,d0
  156.     bsr    EnvOff
  157.     bsr    RazWave
  158.     lea    Circuits,a0
  159.     move.w    #$000F,DmaCon(a0)
  160.     move.w    #%0000011110000000,IntReq(a0)
  161.     move.w    #%0000011110000000,IntEna(a0)
  162.     clr.w    $a8(a0)
  163.     clr.w    $b8(a0)
  164.     clr.w    $c8(a0)
  165.     clr.w    $d8(a0)
  166.     rts
  167.  
  168. ******* Now follow a tricky thing to allow AMAL to grab the address
  169. *    of the vumeters. AMAL will get the address of the music extension
  170. *    BkCheck routine, look 4 bytes before, and get the address of the
  171. *    voices volume level
  172. AdMB    dc.l    0            
  173. ******* LOOK FOR MUSIC BANK
  174. *    Authorised registers: D0-D7/A0-A3
  175. BkCheck    lea    MB(pc),a3
  176.     move.l    MusBank-MB(a3),d0    * Address of OLD music bank
  177.     move.l    2*8(a0),d1        * Address of ACTUAL music bank
  178.     beq.s    BkNo            * 8 bytes per bank (here bank 3)
  179.     move.l    d1,a1            * Looks for "Musi"
  180.     move.l    (a1),d2        
  181.     cmp.l    BkMus-MB(a3),d2
  182.     bne.s    BkNo
  183.     lea    8(a1),a1
  184.     moveq    #0,d1            * Performs a check sum
  185.     add.l    (a1),d1
  186.     add.l    4(a1),d1
  187.     add.l    8(a1),d1
  188.     add.l    12(a1),d1
  189.     cmp.l    d0,a1
  190.     bne.s    BkNew
  191.     cmp.l    MusCheck-MB(a3),d1
  192.     bne.s    BkNew
  193. * Same bank! Do nothing!
  194.     rts
  195. * No more bank!
  196. BkNo    tst.l    d0
  197.     beq.s    BkNo1
  198.     bsr    MuInit
  199.     clr.l    MusBank-MB(a3)
  200. BkNo1    rts
  201. * A NEW bank
  202. BkNew    move.l    a1,MusBank-MB(a3)
  203.     move.l    d1,MusCheck-MB(a3)
  204.     bsr    MuInit
  205.     move.l    MusBank-MB(a3),a0
  206.     move.l    a0,a1
  207.     add.l    (a0),a1
  208.     move.l    a1,BankInst-MB(a3)
  209.     move.l    a0,a1
  210.     add.l    4(a0),a1
  211.     move.l    a1,BankSong-MB(a3)
  212.     add.l    8(a0),a0
  213.     move.l    a0,BankPat-MB(a3)
  214.     rts
  215.  
  216. ******* Call normal error messages
  217. OOMem    moveq    #24,d0            * Out of mem
  218.     bra.s    IError
  219. IFonc:    moveq    #23,d0            * Function call
  220. IError:    move.l    MusAdr(pc),a0        * No need to care about SP!
  221.     jmp    4(a0)
  222. ******* Call customized error messages
  223. WNDef    moveq    #0,d0    
  224.     bra.s    Custom
  225. SNDef    moveq    #1,d0
  226.     bra.s    Custom
  227. BNSam    moveq    #2,d0
  228.     bra.s    Custom
  229. STSho    moveq    #3,d0
  230.     bra.s    Custom
  231. W0Res    moveq    #4,d0
  232.     bra.s    Custom
  233. MnRes    moveq    #5,d0
  234.     bra.s    Custom
  235. MNDef    moveq    #6,d0
  236. Custom:    moveq    #0,d1            * Error can be trapped
  237.     lea    MusErr(pc),a0        * Your list
  238.     move.l    MusAdr(pc),a1
  239.     jmp    8(a1)
  240. ******* Debugging facility
  241. *    If you call this routine, it restore screen, leaves
  242. *    everything opened, and do an ILLEGAL instruction to come back
  243. *    to MONAM2. A0 holds the current PC address, do just do a PC=A0
  244. *    to come just after the JSR IBUG!
  245. *    Really usefull for annoying bugs! Of course, you can't call
  246. *     it under insterrupts, and you have to do a RESET after...
  247. IBug:    move.l    MusAdr(pc),a0
  248.     jmp    (a0)
  249.  
  250. ***********************************************************
  251. *    Now, the code!
  252. *
  253. *    How to get the parameters?
  254. *
  255. *    When an instruction or function is called, you get the parameters
  256. *    pushed in A3. Remember that you unpile them in REVERSE order than
  257. *     the instruction syntax.
  258. *    As you have a entry point for each set of parameters, you know
  259. *    how many are pushed...
  260. *        - INTEGER:    move.l    (a3)+,d0
  261. *        - STRING:    move.l    (a3)+,a0
  262. *                move.w    (a0)+,d0
  263. *        A0---> start of the string.
  264. *        D0---> length of the string
  265. *        - FLOAT:    move.l    (a3)+,d0
  266. *        fast floatting point format.
  267. *    IMPORTANT POINT: you MUST unpile the EXACT number of parameters,
  268. *    to restore A3 to its original level. If you do not, you will not
  269. *    have a immediate error, and AMOS will certainely crash on next
  270. *    UNTIL / WEND / ENDIF / NEXT etc... You do not have to care about it
  271. *    when an error occurs...
  272. *
  273. *    You must preserve A4 to A6. All other registers can be freely
  274. *    modified.
  275. *    You end a routine by a RTS.
  276. *
  277. *    To send a function`s parameter back to AMOS, you load it in D3,
  278. *    and put its type in D2:
  279. *        moveq    #0,d2    for an integer
  280. *        moveq    #1,d2    for a float
  281. *        moveq    #2,d2    for a string
  282. *
  283. *    THE JUMP TABLE
  284. *    
  285. *        The address given to you during initialisation process
  286. *    points to a usefull BRA table, to have quick access to some 
  287. *    important AMOS routines. Here are the offsets of this routines:
  288. *
  289. *    bra    JBug        ;00- Debugging facility
  290. *    bra    RunErr        ;04- Normal error
  291. *    bra    ERunErr        ;08- Specific error
  292. *    bra    BkAd        ;0C- D3.l (number of bank-1)->A0 Bank address
  293. *    bra    Tests        ;10- Performs update
  294. *    bra    WaitRout    ;14- Wait routine (see play)
  295. *    bra    GetEc        ;18- Get screen address D0.l= screen number
  296. *    bra    AdOuBank    ;1C- Address or memory bank? (D3.l)
  297. *    bra    EffBank        ;20- Erases bank #D3.l
  298. *
  299.  
  300. ***********************************************************
  301. *    NARRATOR!
  302. *    This part of code is certainely perfectible, as it is not
  303. *    really "safe"...
  304.  
  305. ******* Open narrator
  306. OpNar    move.l    TranBase(pc),d0
  307.     bne.s    OpNarOk
  308.     movem.l    a3-a6,-(sp)
  309.     lea    MB(pc),a3
  310.     sub.l    a1,a1            * Narrator.device
  311.     move.l    $4,a6
  312.     jsr    FindTask(a6)
  313.     lea    WriteRep-MB(a3),a1
  314.     move.l    d0,$10(a1)
  315.     jsr    AddPort(a6)
  316.     lea    TalkIo-MB(a3),a1
  317.     moveq    #0,d0
  318.     moveq    #0,d1
  319.     lea    NarDevice-MB(a3),a0
  320.     jsr    OpenDev(a6)
  321.     tst.l    d0
  322.     bne    OpNarE
  323.     bsr    NarInit
  324.     lea    TranName-MB(a3),a1    * Translator.library
  325.     moveq    #0,d0
  326.     jsr    OpenLib(a6)
  327.     move.l    d0,TranBase-MB(a3)
  328.     beq    OpNarE
  329.     movem.l    (sp)+,a3-a6
  330. OpNarOk    rts
  331. OpNarE    movem.l    (sp)+,a3-a6
  332. NoNar    moveq    #7,d0
  333.     bra    Custom
  334.  
  335. ******* Init narrator (if here)!
  336. NarInit    lea    TalkIO-MB(a3),a1
  337.     lea    WriteRep-MB(a3),a0
  338.     move.l    a0,14(a1)
  339.     move.w    #150,48(a1)
  340.     move.w    #110,50(a1)
  341.     clr.w    52(a1)
  342.     clr.w    54(a1)
  343.     lea    Amaps-MB(a3),a0
  344.     move.l    a0,56(a1)
  345.     move.w    #4,60(a1)
  346.     move.w    #63,62(a1)
  347.     move.w    #22200,64(a1)
  348.     rts
  349.  
  350. ******* SAY a$[,multi]
  351. ISay2:    bsr    OpNar
  352.     move.l    (a3)+,d7
  353.     bra.s    ISay
  354. ISay1:    bsr    OpNar
  355.     moveq    #0,d7    
  356. ISay:    moveq    #%0000,d0
  357.     bsr    VOnOf
  358.     lea    MB(pc),a0
  359.     clr.w    EnvOn-MB(a0)
  360.     clr.w    Noise-MB(a0)
  361.     move.l    (a3)+,a0
  362.     moveq    #0,d0
  363.     move.w    (a0)+,d0
  364.     move.l    Buffer(a5),a1
  365.     move.l    #1024,d1
  366.     movem.l    a3-a6,-(sp)
  367.     move.l    TranBase(pc),a6
  368.     jsr    Translate(a6)
  369.     tst.w    d0
  370.     bne.s    SayX
  371.     lea    TalkIO(pc),a1
  372.     move.w    #3,28(a1)
  373.     move.l    #1024,36(a1)
  374.     move.l    Buffer(a5),40(a1)
  375.     move.l    ExecBase,a6
  376.     tst.w    d7
  377.     bne.s    ISayA
  378.     jsr    DoIO(a6)
  379.     bra.s    SayX
  380. ISayA    jsr    SendIO(a6)
  381. SayX    movem.l    (sp)+,a3-a6
  382.     moveq    #%1111,d0
  383.     bsr    VOnOf
  384.     rts
  385. ******* SET TALK sex,mode,pitch,rate
  386. ITalk    bsr    OpNar
  387.     move.l    #EntNul,d0
  388.     lea    TalkIO(pc),a1
  389.     move.l    (a3)+,d1
  390.     cmp.l    d0,d1
  391.     beq.s    IRd1
  392.     cmp.w    #40,d1
  393.     bcs    IFonc
  394.     cmp.w    #400,d1
  395.     bhi    IFonc
  396.     move.w    d1,48(a1)
  397. IRd1    move.l    (a3)+,d1
  398.     cmp.l    d0,d1
  399.     beq.s    IRd2
  400.     cmp.w    #65,d1
  401.     bcs    IFonc
  402.     cmp.w    #320,d1
  403.     bhi    IFonc
  404.     move.w    d1,50(a1)
  405. IRd2    move.l    (a3)+,d1
  406.     cmp.l    d0,d1
  407.     beq.s    IRd3
  408.     and.w    #$0001,d1
  409.     move.w    d1,52(a1)
  410. IRd3    move.l    (a3)+,d1
  411.     cmp.l    d0,d1
  412.     beq.s    IRd4
  413.     and.w    #$0001,d1
  414.     move.w    d1,54(a1)
  415. IRd4    rts
  416.  
  417. ***********************************************************
  418. *    MUSIC INSTRUCTION
  419.  
  420. *******    BELL
  421. Bell0    moveq    #0,d3
  422.     moveq    #70,d2
  423.     moveq    #%1111,d1
  424.     moveq    #1,d5
  425.     lea    EnvBell(pc),a0
  426.     move.l    a0,d6
  427.     bra    GoBel
  428. Bell1    moveq    #0,d3
  429.     move.l    (a3)+,d2
  430.     moveq    #%1111,d1
  431.     moveq    #1,d5
  432.     lea    EnvBell(pc),a0
  433.     move.l    a0,d6
  434.     bra    GoBel
  435. ******* BOOM
  436. Boom    moveq    #0,d3
  437.     moveq    #36,d2
  438.     moveq    #0,d5
  439.     lea    EnvBoom(pc),a0
  440.     move.l    a0,d6
  441.     bra.s    Shout
  442. ******* SHOOT
  443. Shoot    moveq    #0,d3
  444.     moveq    #60,d2
  445.     moveq    #0,d5
  446.     lea    EnvShoot(pc),a0
  447.     move.l    a0,d6
  448. * Gives a stereo effect
  449. Shout:    clr.w    d0
  450.     bsr    VOnOf
  451.     moveq    #%1000,d1
  452. Shot    movem.l    d0-d7,-(sp)
  453.     bsr    GoShot
  454.     movem.l    (sp)+,d0-d7
  455.     addq.w    #1,d2
  456.     lsr.w    #1,d1
  457.     bcc.s    Shot
  458.     rts
  459.  
  460. *******    VOLUME n
  461. IVol1    move.l    (a3)+,d0
  462.     moveq    #%1111,d1
  463.     bsr    Vol
  464.     bsr    MVol
  465.     rts
  466. ******* VOLUME voice,n
  467. IVol2    move.l    (a3)+,d0
  468.     move.l    (a3)+,d1
  469. * Set voices volume level
  470. Vol    cmp.l    #64,d0
  471.     bcc    IFonc
  472.     moveq    #0,d2
  473.     lea    EnvBase(pc),a0
  474. Vol1    btst    d2,d1
  475.     beq.s    Vol2
  476.     move.w    d0,EnvDVol(a0)
  477. Vol2    lea    EnvLong(a0),a0
  478.     addq.w    #1,d2
  479.     cmp.w    #4,d2
  480.     bcs.s    Vol1
  481.     rts
  482.  
  483. *******    PLAY note,length
  484. IPlay2    move.l    (a3)+,d3
  485.     bmi    IFonc
  486.     move.l    (a3)+,d2
  487.     moveq    #%1111,d1
  488.     moveq    #-1,d5
  489.     moveq    #0,d6
  490.     bra.s    GoBel
  491. ******* Play voice,note,length
  492. IPlay3    move.l    (a3)+,d3
  493.     bmi    IFonc
  494.     move.l    (a3)+,d2
  495.     move.l    (a3)+,d1
  496.     moveq    #-1,d5
  497.     moveq    #0,d6
  498. GoBel    cmp.l    #96,d2            * <96?
  499.     bhi    IFonc
  500.     move.w    d1,d0            * Stop voices
  501.     eor.w    #$000F,d0
  502.     bsr    VOnOf
  503. GoShot    move.l    a3,-(sp)
  504.     lea    Circuits,a2
  505.     lea    MB(pc),a3
  506.     move.w    EnvOn-MB(a3),d7
  507.     clr.w    EnvOn-MB(a3)
  508. * Explores all 4 voices
  509.     moveq    #0,d0
  510.     move.w    d1,d4
  511.     moveq    #3,d1
  512. IPl1    btst    d1,d4
  513.     beq.s    IPl2
  514.     bsr    VPlay
  515. IPl2    dbra    d1,IPl1
  516. ******* Start!
  517. IPlX    move.w    #$1f4,d1
  518. IPlX0    dbra    d1,IPlX0
  519.     bset    #15,d0
  520.     move.w    d0,DmaCon(a2)
  521.     move.w    d7,EnvOn-MB(a3)
  522.     move.l    (sp)+,a3
  523. * Wait?
  524.     tst.l    d3
  525.     beq.s    IPlX1
  526.     move.l    MusAdr(pc),a0        * Call the AMOS wait routine
  527.     jsr    $14(a0)
  528. IPlX1    rts
  529.  
  530. ******* Play voice D1: WAVE orSAMPLE
  531. *    Note D2
  532. VPlay    movem.l    d0-d7/a0-a2,-(sp)
  533.     bclr    d1,Noise-MB(a3)        * No more random
  534.     tst.w    d2
  535.     beq    VSil
  536.     addq.w    #3,d2
  537.     move.w    d5,d0            * Forced wave? (bell)
  538.     bpl.s    VPl0
  539.     move.w    d1,d0            * Wave or Sample?
  540.     lsl.w    #1,d0
  541.     lea    Waves(pc),a0
  542.     move.w    0(a0,d0.w),d0
  543.     bmi    VPl2
  544.  
  545. * Play WAVE!
  546. VPl0    beq    VPl4
  547.     moveq    #0,d3
  548.     bset    d1,d3
  549.     move.w    d3,DmaCon(a2)        * Stop voice
  550.     lea    $a0(a2),a2
  551.     move.w    d1,d3
  552.     lsl.w    #4,d3
  553.     add.w    d3,a2            * a2-> I/O
  554.     movem.l    d1-d3/a2,-(sp)
  555.     move.w    d0,d1
  556.     bsr    WaveAd
  557.     beq    WNDef
  558.     move.l    a2,a1
  559.     movem.l    (sp)+,d1-d3/a2
  560.     pea    WaveEnv(a1)
  561.     lea    WaveDeb(a1),a1
  562.     subq.w    #1,d2
  563.     move.w    d2,d3
  564.     ext.l    d3
  565.     divu    #12,d3
  566.     lsl.w    #2,d3
  567.     lea    TFreq-MB(a3),a0
  568.     add.w    d3,a0
  569.     add.w    (a0)+,a1
  570.     move.l    a1,(a2)            * AudAd
  571.     move.w    (a0)+,d3
  572.     move.w    d3,4(a2)        * AudLen
  573.     lsl.w    #1,d3
  574.     lea    TNotes-MB(a3),a1
  575.     lsl.w    #1,d2
  576.     mulu    0(a1,d2.w),d3
  577.     move.l    MusClock-MB(a3),d2
  578.     divu    d3,d2
  579.     cmp.w    #124,d2
  580.     bcc.s    VPl1
  581.     moveq    #124,d2
  582. VPl1:    move.w    d2,6(a2)        * AudPer
  583. * Start enveloppe 
  584.     move.l    (sp)+,d5
  585.     tst.l    d6            * Fixed enveloppe? (bell / shoot)
  586.     bne.s    VPl1a
  587.     move.l    d5,d6
  588. VPl1a    lea    EnvBase-MB(a3),a0    
  589.     move.w    d1,d0
  590.     mulu    #EnvLong,d0
  591.     add.w    d0,a0
  592.     move.l    d6,EnvAd(a0)
  593.     move.l    d6,EnvDeb(a0)
  594.     clr.w    EnvVol(a0)
  595.     bsr    MuIntE
  596.     movem.l    (sp)+,a0-a2/d0-d7
  597.     bset    d1,d0
  598.     bset    d1,d7
  599.     rts
  600. ******* Silence!
  601. VSil    moveq    #0,d0
  602.     bset    d1,d0
  603.     move.w    d0,DmaCon(a2)
  604.     movem.l    (sp)+,a0-a2/d0-d7
  605.     bclr    d1,d7
  606.     rts
  607. ******* Play SAMPLE
  608. VPl2    move.l    a2,-(sp)
  609.     move.w    d2,-(sp)
  610.     neg.w    d0
  611.     bsr    GetSam
  612.     move.w    (sp)+,d0
  613.     move.l    (sp)+,a2
  614. VPl3    lea    TNotes-MB(a3),a0
  615.     lsl.w    #1,d0
  616.     mulu    -2(a0,d0.w),d3
  617.     divu    #440,d3
  618.     bra    SPl0
  619. ******* Play NOISE
  620. VPl4    bset    d1,Noise-MB(a3)
  621.     move.w    d2,d0
  622.     move.l    WaveBase-MB(a3),a1
  623.     lea    WaveEnv(a1),a0
  624.     lea    WaveDeb(a1),a1
  625.     move.l    #LNoise,d2
  626.     move.l    #2000,d3
  627.     tst.l    d6
  628.     bne.s    VPl3
  629.     move.l    a0,d6
  630.     bra.s    VPl3
  631.  
  632. ******* PLAY OFF (voice)
  633. IPlOf0    moveq    #%1111,d0
  634.     bra.s    PlOf
  635. IPlOf1    move.l    (a3)+,d0
  636. PlOf    move.l    a3,-(sp)
  637.     lea    MB(pc),a3
  638.     bsr    EnvOff
  639.     move.l    (sp)+,a3
  640.     rts
  641.  
  642. ***********************************************************
  643. *    SAMPLE INSTRUCTIONS
  644.  
  645. *******    SAM BANK n
  646. ISBank    move.l    (a3)+,d0
  647.     bls    IFonc
  648.     cmp.l    #16,d0
  649.     bhi    IFonc
  650.     lea    SamBank(pc),a0
  651.     move.w    d0,(a0)
  652.     rts
  653. ******* SAMLOOP ON
  654. ISLOn1    moveq    #-1,d0
  655. SLoop    move.l    (a3)+,d1
  656.     bra.s    Sl0
  657. ISLOn0    moveq    #-1,d0
  658.     moveq    #%1111,d1
  659.     bra.s    Sl0
  660. ******* SAMLOOP OFF
  661. ISLOf1    moveq    #0,d0
  662.     move.l    (a3)+,d1
  663.     bra.s    Sl0
  664. ISLOf0    moveq    #0,d0
  665.     moveq    #%1111,d1
  666. SL0    moveq    #0,d2
  667.     lea    EnvSam(pc),a0
  668. Sl1    btst    d2,d1
  669.     beq.s    Sl2
  670.     move.w    d0,8(a0)
  671. Sl2    lea    $10(a0),a0
  672.     addq.w    #1,d2
  673.     cmp.w    #4,d2
  674.     bcs.s    Sl1
  675.     rts
  676. ******* NOISE TO voice
  677. INoTo    move.l    (a3)+,d1
  678.     moveq    #0,d0
  679.     bra.s    ISmt
  680. ******* SAMPLE n TO voice
  681. ISamTo    move.l    4(a3),d0
  682.     bsr    GetSam
  683.     move.l    (a3)+,d1
  684.     move.l    (a3)+,d0
  685.     neg.w    d0
  686. * Poke D1-> waves
  687. ISmt    lea    Waves(pc),a0
  688.     moveq    #0,d2
  689. ISmt1    btst    d2,d1
  690.     beq.s    ISmt2
  691.     move.w    d0,(a0)
  692. ISmt2    addq.l    #2,a0
  693.     addq.w    #1,d2
  694.     cmp.w    #4,d2
  695.     bcs.s    ISmt1
  696.     rts
  697. ******* SAM PLAY number
  698. ISam1    move.l    (a3)+,d0
  699.     bsr    GetSam
  700.     moveq    #%1111,d1
  701.     moveq    #0,d6
  702.     bra    GoSam
  703. ******* SAM PLAY voix,number
  704. ISam2    move.l    (a3)+,d0
  705.     bsr    GetSam
  706.     move.l    (a3)+,d1
  707.     moveq    #0,d6
  708.     bra    GoSam
  709. ******* SAM PLAY voix,number,frequence
  710. ISam3    move.l    4(a3),d0
  711.     bsr    GetSam
  712.     move.l    (a3)+,d3
  713.     cmp.l    #500,d3
  714.     ble    IFonc
  715.     addq.l    #4,a3
  716.     move.l    (a3)+,d1    
  717.     moveq    #0,d6
  718.     bra    GoSam
  719. ******* SAM RAW voice,ad,length,freq
  720. ISamR    move.l    (a3)+,d3
  721.     cmp.l    #500,d3
  722.     ble    IFonc
  723.     move.l    (a3)+,d2
  724.     cmp.l    #256,d2
  725.     ble    IFonc
  726.     move.l    (a3)+,a1
  727.     move.l    (a3)+,d1
  728.     moveq    #0,d6
  729. GoSam:    move.l    a3,-(sp)
  730.     lea    MB(pc),a3
  731.     move.w    d1,d0            * Stops music
  732.     eor.w    #$000F,d0
  733.     bsr    VOnOf
  734.     lea    Circuits,a2
  735.     move.w    EnvOn-MB(a3),d7
  736.     clr.w    EnvOn-MB(a3)
  737. * Do all voices
  738.     moveq    #0,d0
  739.     move.w    d1,d4
  740.     moveq    #3,d1
  741. ISp2b    btst    d1,d4
  742.     beq.s    ISp2c
  743.     bsr    SPlay
  744. ISp2c    dbra    d1,ISp2b
  745. * Start!
  746. ISpX    move.w    #$1f4,d1
  747. ISpX1    dbra    d1,ISpX1
  748.     bset    #15,d0
  749.     move.w    d0,DmaCon(a2)
  750.     move.w    d7,EnvOn-MB(a3)
  751.     move.l    (sp)+,a3
  752.     rts
  753.  
  754. ******* Find a sample -> A0
  755. GetSam    move.l    d0,-(sp)
  756.     move.w    SamBank(pc),d3
  757.     ext.l    d3
  758.     beq    IFonc
  759.     move.l    MusAdr(pc),a0
  760.     jsr    $0C(a0)
  761.     move.l    -8(a0),d0
  762.     cmp.l    BkSam(pc),d0
  763.     bne    BNSam
  764. * Get sample characteristics1
  765.     move.l    (sp)+,d0
  766.     bls    IFonc
  767.     cmp.w    (a0),d0
  768.     bhi    SNDef
  769.     lsl.w    #2,d0
  770.     move.l    2-4(a0,d0.w),d0
  771.     beq    SNDef
  772.     add.l    d0,a0
  773.     move.w    8(a0),d3
  774.     ext.l    d3
  775.     move.l    10(a0),d2
  776.     lea    14(a0),a1
  777.     rts
  778.  
  779. ******* SAMPLAY routine
  780. *    A1= Sample
  781. *    D3= Freq
  782. *    D2= Long
  783. *    D1= Voice
  784. SPlay:    movem.l    d0-d7/a0-a2,-(sp)
  785.     bclr    d1,Noise-MB(a3)
  786. SPl0    moveq    #0,d0
  787.     bset    d1,d0            * Stop voice
  788.     move.w    d0,DmaCon(a2)
  789.  
  790.     lea    $a0(a2),a2
  791.     move.w    d1,d4
  792.     lsl.w    #4,d4
  793.     add.w    d4,a2            * a2-> I/O
  794.     move.l    a1,(a2)            * AudAd
  795.     move.w    d2,d4
  796.     lsr.w    #1,d4
  797.     move.w    d4,4(a2)        * AudLen
  798.     move.l    MusClock-MB(a3),d4
  799.     divu    d3,d4
  800.     bvc.s    SPl1
  801.     moveq    #124,d4
  802. SPl1    cmp.w    #124,d4
  803.     bcc.s    SPl2
  804.     moveq    #124,d4
  805. SPl2:    move.w    d4,6(a2)        * AudPer
  806. * Starts enveloppe 
  807.     move.l    d6,a1
  808.     tst.l    d6
  809.     bne    SPl4
  810.     lea    EnvSam-MB(a3),a1
  811.     move.w    d1,d0
  812.     lsl.w    #4,d0
  813.     add.w    d0,a1
  814.     mulu    #50,d2
  815.     divu    d3,d2    
  816.     subq.w    #1,d2
  817.     bhi.s    SPl3
  818.     moveq    #1,d2
  819. SPl3    move.w    d2,4(a1)
  820. SPl4    lea    EnvBase-MB(a3),a0    
  821.     move.w    d1,d0
  822.     mulu    #EnvLong,d0
  823.     add.w    d0,a0
  824.     move.l    a1,EnvAd(a0)
  825.     move.l    a1,EnvDeb(a0)
  826.     clr.w    EnvVol(a0)
  827.     bsr    MuIntE
  828. * Fini!
  829.     movem.l    (sp)+,d0-d7/a0-a2
  830.     bset    d1,d0
  831.     bset    d1,d7
  832.     rts
  833.     
  834. ***********************************************************
  835. *    WAVE INSTRUCTION SET
  836.  
  837. *******    WAVE n TO n
  838. IWave:    move.l    4(a3),d1
  839.     bmi    IFonc
  840.     bsr    WaveAd
  841.     beq    WNDef
  842.     move.l    (a3)+,d1
  843.     move.l    (a3)+,d0
  844.     bra    ISmt
  845. *******    SET WAVE n,a$
  846. ISWave:    move.l    (a3)+,a1
  847.     move.w    (a1)+,d1
  848.     cmp.w    #256,d1
  849.     bcs    STSho
  850.     move.l    (a3)+,d1
  851.     bls    IFonc
  852.     move.l    a3,-(sp)
  853.     lea    MB(pc),a3
  854.     bsr    NeWave
  855.     bne    OOMem
  856.     move.l    (sp)+,a3
  857.     rts
  858. *******    DEL WAVE 
  859. IDWave1    move.l    (a3)+,d1
  860.     bmi    IFonc
  861.     beq    W0Res
  862.     cmp.l    #1,d1
  863.     beq    W0Res
  864.     move.l    a3,-(sp)
  865.     lea    MB(pc),a3
  866.     moveq    #%1111,d0
  867.     bsr    EnvOff
  868.     bsr    WaveAd
  869.     beq    WNDef
  870.     bsr    WaveDel
  871.     bsr    NoWave
  872.     move.l    (sp)+,a3
  873.     rts
  874. *******    SET ENVEL n,n TO n,v
  875. ISEnv    move.l    (a3)+,d4
  876.     cmp.l    #64,d4
  877.     bcc    IFonc
  878.     move.l    (a3)+,d3
  879.     move.l    (a3)+,d5
  880.     bmi    IFonc
  881.     cmp.l    #7,d5
  882.     bcc    IFonc
  883.     move.l    (a3)+,d1
  884.     bmi    IFonc
  885.     tst.w    d5
  886.     bne.s    ISe1
  887.     tst.w    d3
  888.     bls    IFonc
  889. ISe1    move.l    a3,-(sp)
  890.     lea    MB(pc),a3
  891.     bsr    WaveAd
  892.     beq    WNDef
  893.     lsl.w    #2,d5
  894.     lea    WaveEnv(a2,d5.w),a2
  895.     move.w    d3,(a2)+
  896.     move.w    d4,(a2)+
  897.     clr.w    (a2)
  898.     move.l    (sp)+,a3
  899.     rts
  900. ******* RAZ WAVES
  901. RazWave    movem.l    a2/d0-d2,-(sp)
  902.     moveq    #%1111,d0
  903.     bsr    EnvOff            * Stop all voices
  904.     lea    WaveBase-MB(a3),a2    * Erase all instruments
  905.     move.l    a2,d2
  906. RzW1    move.l    d2,a2
  907.     move.l    (a2),d0
  908.     beq.s    RzW2
  909.     move.l    d0,a2
  910.     bsr    WaveDel
  911.     bra.s    RzW1
  912. RzW2    bsr    NoWave
  913.     movem.l    (sp)+,a2/d0-d2
  914.     rts
  915. * Plus de Waves speciales
  916. NoWave    lea    Waves(pc),a0        * Default waves
  917.     move.w    #1,(a0)+
  918.     move.w    #1,(a0)+
  919.     move.w    #1,(a0)+
  920.     move.w    #1,(a0)+
  921.     rts
  922.  
  923. ******* NEW WAVES
  924. *    A1= Array address
  925. *    D1= # to create
  926. NeWave:    movem.l    d1-d7/a1-a2,-(sp)
  927. NeW0    bsr    WaveAd
  928.     beq.s    NeW1
  929.     moveq    #%1111,d0
  930.     bsr    EnvOff
  931.     bsr    WaveDel
  932.     bra.s    NeW0
  933. NeW1    move.l    #WaveLong,d0
  934.     SyCall    SyChip
  935.     beq.s    NeWE
  936.     move.l    d0,(a2)
  937.     move.l    d0,a2
  938.     move.w    d1,WaveNb(a2)
  939. * Copy default ADSR
  940.     move.l    a1,-(sp)
  941.     lea    EnvDef-MB(a3),a0
  942.     lea    WaveEnv(a2),a1
  943. NeW3    move.l    (a0)+,(a1)+
  944.     bne.s    NeW3
  945.     move.l    (sp)+,a1
  946. * Full wave: 256 bytes
  947.     lea    WaveDeb(a2),a2
  948.     move.l    a2,a0
  949.     moveq    #256/4-1,d0
  950. NeW2    move.l    (a1)+,(a0)+
  951.     dbra    d0,NeW2
  952. * 1/2
  953.     move.l    a2,a1
  954.     move.l    a0,a2
  955.     moveq    #127,d0
  956.     bsr    NewRout
  957. * 1/4
  958.     move.l    a2,a1
  959.     move.l    a0,a2
  960.     moveq    #63,d0
  961.     bsr    NewRout
  962. * 1/8
  963.     move.l    a2,a1    
  964.     move.l    a0,a2
  965.     moveq    #31,d0
  966.     bsr    NewRout
  967. * 1/16
  968.     move.l    a2,a1
  969.     move.l    a0,a2
  970.     moveq    #15,d0
  971.     bsr    NewRout
  972. * 1/32
  973.     move.l    a2,a1
  974.     move.l    a0,a2
  975.     moveq    #7,d0
  976.     bsr    NewRout
  977. * 1/64
  978.     move.l    a2,a1
  979.     move.l    a0,a2
  980.     moveq    #3,d0
  981.     bsr    NewRout
  982. ******* No error
  983.     moveq    #0,d0
  984. NeWx    movem.l    (sp)+,d1-d7/a1-a2
  985.     rts
  986. ******* Out of mem
  987. NeWE    moveq    #-1,d0
  988.     bra.s    NeWx
  989.  
  990. ******* Divide a sample by 2
  991. NewRout    move.b    (a1)+,d1
  992.     ext.w    d1
  993.     move.b    (a1)+,d2
  994.     ext.w    d2
  995.     add.w    d2,d1
  996.     asr.w    #1,d1
  997.     move.b    d1,(a0)+
  998.     dbra    d0,NewRout
  999.     rts
  1000.  
  1001. ******* Get a wave address
  1002. WaveAd:    moveq    #0,d2
  1003.     lea    WaveBase(pc),a2
  1004.     move.l    (a2),d0
  1005.     beq.s    WAd2
  1006. WAd1    move.l    a2,d2
  1007.     move.l    d0,a2
  1008.     cmp.w    WaveNb(a2),d1
  1009.     beq.s    WAd3
  1010.     move.l    (a2),d0
  1011.     bne.s    WAd1
  1012. WAd2    moveq    #0,d0
  1013.     rts
  1014. WAd3    moveq    #-1,d0
  1015.     rts
  1016.  
  1017. ******* Deletion of a WAVE (A2)-D2
  1018. WaveDel    movem.l    a0-a2/d0-d2,-(sp)
  1019.     move.w    WaveNb(a2),d1
  1020.     move.l    d2,a0
  1021.     move.l    (a2),(a0)
  1022.     move.l    #WaveLong,d0
  1023.     move.l    a2,a1
  1024.     SyCall    SyFree
  1025.     movem.l    (sp)+,a0-a2/d0-d2
  1026.     rts
  1027.  
  1028. ***********************************************************
  1029. *    ENVELOPPES 
  1030.  
  1031. ***********************************************************
  1032. *    STOP ENVELOPPE D0
  1033. EnvOff    movem.l    d0-d3/a0,-(sp)
  1034.     move.w    EnvOn-MB(a3),d1
  1035.     clr.w    EnvOn-MB(a3)
  1036.     moveq    #0,d3
  1037.     lea    Circuits,a0
  1038.     moveq    #0,d2
  1039. EOf1    btst    d2,d0
  1040.     beq.s    EOf2
  1041.     bclr    d2,d1
  1042.     beq.s    EOf2
  1043.     bset    d2,d3
  1044.     move.w    #2,$a4(a0)
  1045.     clr.w    $a8(a0)
  1046. EOf2    lea    $10(a0),a0
  1047.     addq.w    #1,d2
  1048.     cmp.w    #4,d2
  1049.     bcs.s    EOf1
  1050.     move.w    d1,EnvOn-MB(a3)
  1051.     move.w    d3,MuReStart-MB(a3)
  1052.     movem.l    (sp)+,d0-d3/a0
  1053.     rts
  1054.     
  1055. ******* Next enveloppe
  1056. MuIntE    move.l    EnvAd(a0),a1
  1057. MuIe0    move.w    (a1)+,d3
  1058.     beq.s    MuIntS
  1059.     bmi.s    MuIe1
  1060.     move.w    d3,EnvNb(a0)
  1061.     move.w    EnvDVol(a0),d4
  1062.     mulu    (a1)+,d4
  1063.     lsr.w    #6,d4
  1064.     sub.w    EnvVol(a0),d4
  1065.     ext.l    d4
  1066.     lsl.w    #8,d4
  1067.     divs    d3,d4
  1068.     ext.l    d4
  1069.     lsl.l    #8,d4
  1070.     move.l    d4,EnvDelta(a0)
  1071.     clr.w    EnvVol+2(a0)
  1072.     move.l    a1,EnvAd(a0)
  1073.     rts
  1074. * Loop
  1075. MuIe1    move.l    EnvDeb(a0),a1
  1076.     bra.s    MuIe0
  1077. * End of a voice
  1078. MuIntS    bset    d1,d5
  1079.     bclr    d1,d0
  1080.     bclr    d1,Noise-MB(a3)
  1081. * Restarts the music
  1082.     bset    d1,MuReStart+1-MB(a3)
  1083.     rts
  1084.  
  1085. ******************************************************************
  1086. *    MUSIC
  1087.  
  1088. ******* Music initialisation
  1089. MuInit:    clr.l    MuBase-MB(a3)
  1090.     clr.w    MuNumber-MB(a3)
  1091.     move.l    #$DFF0A0,MuChip0-MB(a3)
  1092.     move.l    #$DFF0B0,MuChip1-MB(a3)
  1093.     move.l    #$DFF0C0,MuChip2-MB(a3)
  1094.     move.l    #$DFF0D0,MuChip3-MB(a3)
  1095.     move.w    #$000F,MuDMAsk-MB(a3)
  1096.     clr.w    MuReStart-MB(a3)
  1097.     bsr    MOff
  1098.     rts
  1099.  
  1100. ******* MUSIC OFF-> Stops all musics
  1101. IMuSOff    movem.l    a0-a3/d0-d1,-(sp)
  1102.     lea    MB(pc),a3
  1103.     clr.l    MuBase-MB(a3)
  1104.     clr.w    MuNumber-MB(a3)
  1105.     bsr    MOff
  1106.     movem.l    (sp)+,a0-a3/d0-d1
  1107.     rts
  1108.  
  1109. ******* MUSIC STOP-> Stops current music
  1110. IMuStop    movem.l    a0-a3/d0-d1,-(sp)
  1111.     lea    MB(pc),a3
  1112.     move.l    MuBase-MB(a3),d0
  1113.     beq.s    IStp
  1114.     clr.w    MuBase-MB(a3)
  1115.     move.l    d0,a0
  1116.     clr.w    VoiCpt0(a0)
  1117.     clr.w    VoiCpt1(a0)
  1118.     clr.w    VoiCpt2(a0)
  1119.     clr.w    VoiCpt3(a0)
  1120.     move.l    d0,MuBase-MB(a3)
  1121. IStp    movem.l    (sp)+,a0-a3/d0-d1
  1122.     rts
  1123.  
  1124. ******* MUSIC VOLUME
  1125. IMVol    move.l    (a3)+,d0
  1126.     cmp.l    #64,d0
  1127.     bcc    IFonc
  1128. * Set volume
  1129. MVol    and.w    #63,d0
  1130.     lea    MB(pc),a0
  1131.     move.w    d0,MuVolume-MB(a0)
  1132.     move.l    MuBase-MB(a0),d4
  1133.     beq.s    MVol3
  1134.     clr.l    MuBase-MB(a0)
  1135.     lea    MuBuffer-MB(a0),a1
  1136.     move.w    MuNumber-MB(a0),d1
  1137. MVol0    move.l    a1,a2
  1138.     moveq    #3,d2
  1139. MVol1    move.w    VoiDVol(a2),d3
  1140.     mulu    d0,d3
  1141.     lsr.w    #6,d3
  1142.     move.w    d3,VoiVol(a2)
  1143.     lea    VoiLong(a2),a2
  1144.     dbra    d2,MVol1
  1145. MVol2    lea    MuLong(a1),a1
  1146.     subq.w    #1,d1
  1147.     bne.s    MVol0
  1148.     move.l    d4,MuBase-MB(a0)
  1149. MVol3    rts
  1150.  
  1151. ******* VOICE ON/OFF Voices
  1152. IVoice    move.l    (a3)+,d0
  1153.     and.w    #$000F,d0
  1154.     move.l    a3,-(sp)
  1155.     lea    MB(pc),a3
  1156.     bsr    VOnOf
  1157.     movem.l    (sp)+,a3
  1158.     rts
  1159.  
  1160. ******* Start / Stop voices D0
  1161. VOnOf    movem.l    d0-d5/a0-a3,-(sp)
  1162.     lea    MB(pc),a3
  1163.     move.l    MuBase-MB(a3),d1
  1164.     beq.s    VooX
  1165.     clr.l    MuBase-MB(a3)
  1166.     move.l    d1,a1
  1167.     move.l    d1,a2
  1168.     move.w    MuDMAsk-MB(a3),d1
  1169.     move.w    d0,MuDMAsk-MB(a3)
  1170.     move.l    WaveBase-MB(a3),a0
  1171.     lea    WaveDeb(a0),a0
  1172.     move.l    a0,d3
  1173.     lea    MuChip0-MB(a3),a0
  1174.     moveq    #0,d2
  1175.     moveq    #0,d4
  1176. * Exploration loop
  1177. Voo1    btst    d2,d0
  1178.     bne.s    Voo2
  1179. * Stop a voice!
  1180.     btst    d2,d1            * Already stopped?
  1181.     beq.s    VooN
  1182.     bset    d2,d4
  1183.     move.l    d3,(a0)
  1184.     bclr    d2,MuStart+1(a2)
  1185.     bclr    d2,MuStop+1(a2)
  1186.     bra.s    VooN
  1187. * Re start a voice
  1188. Voo2    btst    d2,d1            * Already on?
  1189.     bne.s    VooN
  1190.     bset    d2,MuReStart+1-MB(a3)
  1191. * Next
  1192. VooN    addq.l    #4,a0
  1193.     lea    VoiLong(a1),a1
  1194.     addq.w    #1,d2
  1195.     cmp.w    #4,d2
  1196.     bcs.s    Voo1
  1197. * Stop them!
  1198.     move.w    d4,Circuits+DmaCon
  1199.     move.w    #$200,d0
  1200. VooW    dbra    d0,VooW
  1201.     move.l    a2,MuBase-MB(a3)
  1202. VooX    movem.l    (sp)+,d0-d5/a0-a3
  1203.     rts
  1204.  
  1205. ******* MUSIC n
  1206. IMusic    move.l    (a3)+,d3
  1207.     bls    IFonc
  1208. * Points to the SONG
  1209.     move.l    a3,-(sp)
  1210.     lea    MB(pc),a3    
  1211.     tst.l    MusBank-MB(a3)
  1212.     beq    MnRes
  1213.     move.l    BankSong-MB(a3),a1
  1214.     cmp.w    (a1),d3
  1215.     bhi    MNDef
  1216.     lsl.w    #2,d3
  1217.     add.l    2-4(a1,d3.w),a1
  1218. * Still room?
  1219.     cmp.w    #3,MuNumber-MB(a3)
  1220.     bcc    IMusX
  1221.     clr.l    MuBase-MB(a3)
  1222. * Buffer address
  1223.     move.w    MuNumber-MB(a3),d0
  1224.     move.w    d0,d1
  1225.     addq.w    #1,MuNumber-MB(a3)
  1226.     mulu    #MuLong,d0
  1227.     lea    MuBuffer-MB(a3),a2
  1228.     add.w    d0,a2
  1229. * Init datas
  1230.     moveq    #(VoiLong*4)/2-1,d0
  1231.     move.l    a2,a0
  1232. IMus1    clr.w    (a0)+
  1233.     dbra    d0,IMus1
  1234.     clr.w    MuStop(a2)
  1235.     clr.w    MuStart(a2)
  1236. * Init parameters
  1237.     move.l    a2,d2
  1238.     move.w    #100,MuCpt(a2)
  1239.     move.w    #14,MuTempo(a2)
  1240.     moveq    #0,d0
  1241. IMus2    move.w    #1,VoiCpt(a2)
  1242.     lea    FoEnd-MB(a3),a0
  1243.     move.l    a0,VoiAdr(a2)
  1244.     move.l    a1,a0
  1245.     add.w    0(a0,d0.w),a0
  1246.     move.l    a0,VoiPat(a2)
  1247.     move.l    a0,VoiDPat(a2)
  1248.     lea    VoiLong(a2),a2
  1249.     addq.w    #2,d0
  1250.     cmp.w    #8,d0
  1251.     bne.s    IMus2
  1252. * Starts music
  1253.     move.l    d2,MuBase-MB(a3)
  1254. IMusX    move.l    (sp)+,a3
  1255.     rts
  1256.  
  1257. ******* Tempo T
  1258. ITempo    move.l    (a3)+,d0
  1259.     cmp.l    #100,d0
  1260.     bhi    IFonc
  1261.     move.l    MuBase(pc),d1
  1262.     beq.s    ITemp
  1263.     move.l    d1,a0
  1264.     move.w    d0,MuTempo(a0)
  1265. ITemp    rts
  1266.  
  1267. ***********************************************************
  1268. *    =VU METRE(v)
  1269. FVu    move.l    (a3)+,d0
  1270.     cmp.l    #4,d0
  1271.     bcc    IFonc
  1272.     lea    MB(pc),a0
  1273.     moveq    #0,d3
  1274.     move.b    0(a0,d0.w),d3
  1275.     clr.b    0(a0,d0.w)
  1276.     moveq    #0,d2
  1277.     rts
  1278.  
  1279. ***********************************************************
  1280. *    =MU BASE
  1281. FMB    lea    MB(pc),a0
  1282.     move.l    a0,d3
  1283.     moveq    #0,d2
  1284.     rts
  1285.  
  1286. ***********************************************************
  1287. *
  1288. *    INTERRUPT ROUTINES
  1289. *
  1290. *    Here is the main point! Happy SoundTracker users, forget
  1291. *    everything! This music routine does not use the same system!
  1292. *    Music is not coded in parallel (all note for all voices
  1293. *    in 16 bytes), but in a more efficient but a little more complex
  1294. *    "track" system.
  1295. *    Each voice has its own track. More than that, the delays between
  1296. *    each note is not fixed as in SoundTracker (to have important
  1297. *    delays you just leave a few empty notes after), but coded in the
  1298. *    note itself. The delay is acheived by counting this value to
  1299. *    zero.
  1300. *    LABEL are not coded within the note, but stands before it, in
  1301. *    two bytes. The main advantage is that you can have up to 128
  1302. *    different labels, and the parameter of this label is a full
  1303. *    byte. More than one label can be put after each other, and will
  1304. *    only have effect for the next note.
  1305. *
  1306. *    This structure makes AMOS music player very versatile: it can play
  1307. *    (after appropriate conversion) SoundTracker-like musics or IFF
  1308. *    music files.
  1309. *
  1310. *    I also realised when the music routine was finished, that it
  1311. *    would not be really difficult to implement the music priority
  1312. *    system, which I think is really useful to do games!
  1313. *
  1314. *    If you carefully look to the code, I am sure you will be able
  1315. *    to grab a few clock cycle here or there. I prefer to write readable
  1316. *    code, a little slower (very little) than more efficient tricky
  1317. *    code!!!
  1318. *
  1319. *    For version 2 I want to implement synthetic instruments which saves
  1320. *    A LOT of memory. Anyway, almost everything is ready to do so, with
  1321. *    all the WAVE interrupt routines...
  1322. *
  1323. ***********************************************************    
  1324.  
  1325. ******* VBL Entry
  1326. MusInt    lea    MB(pc),a3    
  1327.     move.w    EnvOn-MB(a3),d0
  1328.     beq    Music
  1329.     lea    EnvBase-MB(a3),a0
  1330.     lea    $a0(a6),a2
  1331.     moveq    #0,d1
  1332.     moveq    #3,d2
  1333.     moveq    #0,d5
  1334. MuInt1    btst    d1,d0
  1335.     beq.s    MuIntN
  1336.     move.l    EnvDelta(a0),d3
  1337.     add.l    EnvVol(a0),d3
  1338.     move.l    d3,EnvVol(a0)
  1339.     swap    d3
  1340.     move.w    d3,8(a2)
  1341. MuInt2    subq.w    #1,EnvNb(a0)
  1342.     bne.s    MuIntN
  1343.     bsr    MuIntE
  1344. MuIntN    lea    EnvLong(a0),a0
  1345.     lea    $10(a2),a2
  1346.     addq.w    #1,d1
  1347.     dbra    d2,MuInt1
  1348.     move.w    d0,EnvOn-MB(a3)
  1349.     move.w    d5,DmaCon(a6)
  1350. ******* Make noise?
  1351.     tst.w    Noise-MB(a3)
  1352.     beq.s    Music
  1353.     move.w    PNoise-MB(a3),d0
  1354.     moveq    #7,d2
  1355.     move.w    BSeed-MB(a3),d1
  1356.     move.l    WaveBase-MB(a3),a0
  1357. INoi1    add.w    6(a6),d1
  1358.     mulu    #$3171,d1
  1359.     lsr.l    #8,d1
  1360.     move.w    d1,WaveDeb(a0,d0.w)
  1361.     subq.w    #2,d0
  1362.     bpl.s    INoi2
  1363.     move.w    #LNoise-2,d0
  1364. INoi2    dbra    d2,INoi1
  1365.     move.w    d0,PNoise-MB(a3)
  1366.     move.w    d1,BSeed-MB(a3)
  1367.  
  1368. *******    Music routine
  1369. Music:    move.l    MuBase-MB(a3),d0
  1370.     beq    MuEnd1
  1371.     movem.l    a4-a6,-(sp)
  1372.     move.l    d0,a5
  1373.     bsr    MuEvery
  1374. * Here is a smart counter, which gives progressive results
  1375. * from zero to 100...
  1376.     move.w    MuCpt(a5),d0
  1377.     add.w    MuTempo(a5),d0
  1378.     move.w    d0,MuCpt(a5)
  1379.     cmp.w    #100,d0
  1380.     bcs    MuEnd
  1381.     sub.w    #100,MuCpt(a5)
  1382. * Lets go for one step of music!
  1383.     moveq    #0,d5
  1384.     moveq    #0,d7
  1385.     move.l    a5,a4
  1386.     tst.b    VoiCpt+1(a4)
  1387.     beq.s    Mus0
  1388.     addq.w    #1,d5
  1389.     subq.b    #1,VoiCpt+1(a4)
  1390.     bne.s    Mus0
  1391.     moveq    #0,d6
  1392.     move.l    MuChip0-MB(a3),a6
  1393.     bsr    MuStep
  1394. Mus0    lea    MuVoix1(a5),a4
  1395.     tst.b    VoiCpt+1(a4)
  1396.     beq.s    Mus1
  1397.     addq.w    #1,d5
  1398.     subq.b    #1,VoiCpt+1(a4)
  1399.     bne.s    Mus1
  1400.     moveq    #1,d6
  1401.     move.l    MuChip1-MB(a3),a6
  1402.     bsr    MuStep
  1403. Mus1    lea    MuVoix2(a5),a4
  1404.     tst.b    VoiCpt+1(a4)
  1405.     beq.s    Mus2
  1406.     addq.w    #1,d5
  1407.     subq.b    #1,VoiCpt+1(a4)
  1408.     bne.s    Mus2
  1409.     moveq    #2,d6
  1410.     move.l    MuChip2-MB(a3),a6
  1411.     bsr    MuStep
  1412. Mus2    lea    MuVoix3(a5),a4
  1413.     tst.b    VoiCpt+1(a4)
  1414.     beq.s    Mus3
  1415.     addq.w    #1,d5
  1416.     subq.b    #1,VoiCpt+1(a4)
  1417.     bne.s    Mus3
  1418.     moveq    #3,d6
  1419.     move.l    MuChip3-MB(a3),a6
  1420.     bsr    MuStep
  1421. Mus3    and.w    MuDMAsk-MB(a3),d7
  1422.     move.w    d7,$DFF096
  1423.     tst.w    d5
  1424.     beq.s    MuFin
  1425. MuEnd    movem.l    (sp)+,a4-a6
  1426. MuEnd1    rts
  1427. * Finished?
  1428. MuFin    subq.w    #1,MuNumber-MB(a3)
  1429.     beq    MuFini
  1430. * Restarts previous music
  1431.     move.w    MuNumber-MB(a3),d0
  1432.     subq.w    #1,d0
  1433.     mulu    #MuLong,d0
  1434.     lea    MuBuffer-MB(a3),a0
  1435.     add.w    d0,a0
  1436.     move.l    a0,MuBase-MB(a3)
  1437.     move.w    MuDMAsk-MB(a3),MuReStart-MB(a3)
  1438.     clr.w    MuStart(a0)
  1439.     clr.w    MuStop(a0)
  1440.     bra.s    MuEnd
  1441. * Really finished!
  1442. MuFini    clr.l    MuBase-MB(a3)
  1443.     bsr.s    MOff
  1444.     bra.s    MuEnd
  1445. * Stop sound routine
  1446. MOff    lea    Circuits,a0
  1447.     move.w    MuDMAsk-MB(a3),d0
  1448.     beq.s    MOf3
  1449.     move.w    d0,DmaCon(a0)
  1450.     moveq    #3,d1
  1451. MOf1    btst    d1,d0
  1452.     beq.s    MOf2
  1453.     move.w    #2,$a4(a0)
  1454.     clr.w    $a8(a0)
  1455. MOf2    lea    $10(a0),a0
  1456.     dbra    d1,MOf1
  1457. MOf3    rts
  1458.  
  1459. ******* One step of music for one voice
  1460. MuStep    move.l    VoiAdr(a4),a2
  1461. MuSt0    move.w    (a2)+,d0
  1462.     bmi.s    MuEtiq
  1463. * Play a normal note
  1464.     move.w    d0,VoiCpt(a4)
  1465.     move.w    (a2)+,d0
  1466.     beq.s    MuSt1
  1467.     move.w    d0,VoiNote(a4)
  1468.     move.w    d0,$06(a6)
  1469.     move.l    BankInst-MB(a3),d0
  1470.     move.l    VoiInst(a4),a0
  1471.     add.l    (a0),d0
  1472.     move.l    d0,(a6)
  1473.     move.w    8(a0),$04(a6)
  1474.     bset    d6,d7
  1475.     bclr    d6,MuStop+1(a5)
  1476.     bset    d6,MuStart+1(a5)
  1477.     move.w    VoiSlB(a4),VoiSlide(a4)
  1478.     move.w    VoiSlC(a4),VoiSlB(a4)
  1479.     move.b    VoiVol+1(a4),0(a3,d6.w)
  1480. MuSt1    move.l    a2,VoiAdr(a4)
  1481.     rts
  1482. * Label entry
  1483. MuEtiq    move.w    d0,d1
  1484.     and.w    #$7F00,d0
  1485.     lsr.w    #6,d0
  1486.     lea    MuJumps(pc),a0
  1487.     jmp    0(a0,d0.w)
  1488.  
  1489. ******* Jmup table to labels
  1490. MuJumps    bra    EtEnd            * 00-> Fin pattern
  1491.     bra    EtSlUp            * 01-> Slide up
  1492.     bra    EtSlDo            * 02-> Slide down
  1493.     bra    EtSVol            * 03-> Set volume
  1494.     bra    MuStep            * 04-> 
  1495.     bra    EtRep            * 05-> Repeat
  1496.     bra    EtLOn            * 06-> Led On
  1497.     bra    EtLOff            * 07-> Led Off
  1498.     bra    EtTemp            * 08-> Set Tempo
  1499.     bra    EtInst            * 09-> Set Instrument
  1500. ******* End of a pattern
  1501. EtEnd    clr.w    VoiCpt(a4)
  1502.     clr.w    VoiRep(a4)
  1503.     clr.l    VoiDeb(a4)
  1504.     move.l    VoiPat(a4),a0
  1505. RePat    move.w    (a0)+,d0
  1506.     bmi.s    EtEnd1
  1507.     move.l    a0,VoiPat(a4)
  1508.     move.l    BankPat-MB(a3),a0
  1509.     cmp.w    (a0),d0
  1510.     bhi.s    EtEndX
  1511.     lsl.w    #2,d0
  1512.     add.w    d6,d0
  1513.     lsl.w    #1,d0
  1514.     move.w    2(a0,d0.w),d0
  1515.     beq.s    EtEndX
  1516.     lea    0(a0,d0.w),a2
  1517.     bra    MuSt0
  1518. EtEndX    rts
  1519. EtEnd1    cmp.w    #-1,d0
  1520.     beq.s    EtEndX
  1521.      move.l    VoiDPat(a4),a0
  1522.     bra.s    RePat
  1523. ******* Change instrument
  1524. EtInst    and.w    #$00FF,d1
  1525.     move.l    BankInst-MB(a3),a1
  1526.     lsl.w    #5,d1
  1527.     lea    2(a1,d1.w),a1
  1528.     move.l    a1,VoiInst(a4)
  1529.     move.w    12(a1),d0
  1530.     cmp.w    #64,d0
  1531.     bcs.s    EtInst1
  1532.     moveq    #63,d0
  1533. EtInst1    move.w    d0,VoiDVol(a4)
  1534.     mulu    MuVolume-MB(a3),d0
  1535.     lsr.w    #6,d0
  1536.     move.w    d0,VoiVol(a4)
  1537.     bra    MuSt0
  1538. ******* Slide up 
  1539. EtSlUp    and.w    #$00FF,d1
  1540.     neg.w    d1
  1541.     move.w    d1,VoiSlide(a4)
  1542.     move.w    d1,VoiSlB(a4)
  1543.     clr.w    VoiSlC(a4)
  1544.     bra    MuSt0
  1545. ******* Slide down
  1546. EtSlDo    and.w    #$00FF,d1
  1547.     move.w    d1,VoiSlide(a4)
  1548.     move.w    d1,VoiSlB(a4)
  1549.     clr.w    VoiSlC(a4)
  1550.     bra    MuSt0
  1551. ******* Set Volume
  1552. EtSVol    and.w    #$00FF,d1
  1553.     cmp.w    #64,d1
  1554.     bcs.s    EtSVol1
  1555.     moveq    #63,d1
  1556. EtSVol1    move.w    d1,VoiDVol(a4)
  1557.     mulu    MuVolume-MB(a3),d1
  1558.     lsr.w    #6,d1
  1559.     move.w    d1,VoiVol(a4)
  1560.     bra    MuSt0
  1561. ******* Set Tempo
  1562. EtTemp    and.w    #$00FF,d1
  1563.     move.w    d1,MuTempo(a5)
  1564.     bra    MuSt0
  1565. ******* Led On
  1566. EtLOn    bclr    #1,$bfe001
  1567.     bra    MuSt0
  1568. ******* Led Off
  1569. EtLOff    bset    #1,$bfe001
  1570.     bra    MuSt0
  1571. ******* Repeat
  1572. EtRep    and.w    #$00FF,d1
  1573.     bne.s    EtRep1
  1574.     move.l    a2,VoiDeb(a4)
  1575.     bra    MuSt0
  1576. EtRep1    tst.w    VoiRep(a4)
  1577.     bne.s    EtRep2
  1578.     move.w    d1,VoiRep(a4)
  1579.     bra    MuSt0
  1580. EtRep2    subq.w    #1,VoiRep(a4)
  1581.     beq    MuSt0
  1582.     move.l    VoiDeb(a4),d0
  1583.     beq    MuSt0
  1584.     move.l    d0,a2
  1585.     bra    MuSt0
  1586.  
  1587. *******    Routine call every VBL
  1588. MuEvery    
  1589. * Update VOLUME and FREQUENCE
  1590.     move.l    MuChip0-MB(a3),a6        * Voix 0
  1591.     move.w    VoiSlide0(a5),d0
  1592.     add.w    d0,VoiNote0(a5)
  1593.     move.w    VoiNote0(a5),$06(a6)
  1594.     move.w    VoiVol0(a5),$08(a6)
  1595.     move.l    MuChip1-MB(a3),a6        * Voix 1
  1596.     move.w    VoiSlide1(a5),d0
  1597.     add.w    d0,VoiNote1(a5)
  1598.     move.w    VoiNote1(a5),$06(a6)
  1599.     move.w    VoiVol1(a5),$08(a6)
  1600.     move.l    MuChip2-MB(a3),a6        * Voix 2
  1601.     move.w    VoiSlide2(a5),d0    
  1602.     add.w    d0,VoiNote2(a5)
  1603.     move.w    VoiNote2(a5),$06(a6)
  1604.     move.w    VoiVol2(a5),$08(a6)
  1605.     move.l    MuChip3-MB(a3),a6        * Voix 3
  1606.     move.w    VoiSlide3(a5),d0
  1607.     add.w    d0,VoiNote3(a5)
  1608.     move.w    VoiNote3(a5),$06(a6)
  1609.     move.w    VoiVol3(a5),$08(a6)
  1610.  
  1611. * Second step of sample?
  1612. MuRsXX    move.w    MuStop(a5),d0
  1613.     beq    MuEvX
  1614.     move.l    BankInst-MB(a3),d1
  1615.     btst    #0,d0                * Voix 0
  1616.     beq.s    MuEv0
  1617.     move.l    MuChip0-MB(a3),a6
  1618.     move.l    VoiInst0(a5),a0
  1619.     move.l    d1,d2
  1620.     add.l    4(a0),d2
  1621.     move.l    d2,(a6)
  1622.     move.w    10(a0),$04(a6)
  1623. MuEv0    btst    #1,d0                * Voix 1
  1624.     beq.s    MuEv1
  1625.     move.l    MuChip1-MB(a3),a6
  1626.     move.l    VoiInst1(a5),a0
  1627.     move.l    d1,d2
  1628.     add.l    4(a0),d2
  1629.     move.l    d2,(a6)
  1630.     move.w    10(a0),$04(a6)
  1631. MuEv1    btst    #2,d0                * Voix 2
  1632.     beq.s    MuEv2
  1633.     move.l    MuChip2-MB(a3),a6
  1634.     move.l    VoiInst2(a5),a0
  1635.     move.l    d1,d2
  1636.     add.l    4(a0),d2
  1637.     move.l    d2,(a6)
  1638.     move.w    10(a0),$04(a6)
  1639. MuEv2    btst    #3,d0                * Voix 3
  1640.     beq.s    MuEv3
  1641.     move.l    MuChip3-MB(a3),a6
  1642.     move.l    VoiInst3(a5),a0
  1643.     move.l    d1,d2
  1644.     add.l    4(a0),d2
  1645.     move.l    d2,(a6)
  1646.     move.w    10(a0),$04(a6)
  1647. MuEv3    
  1648.  
  1649. * Start a voice
  1650. MuEvX    move.w    MuStart(a5),d1
  1651.     move.w    d1,MuStop(a5)
  1652.     clr.w    MuStart(a5)
  1653.     or.w    d1,d0
  1654.     and.w    MuDMAsk-MB(a3),d0
  1655.     bset    #15,d0
  1656.     move.w    d0,$DFF096
  1657.  
  1658. * Restart voices?
  1659.     move.w    MuReStart-MB(a3),d0
  1660.     beq    MuRsX
  1661.     moveq    #0,d3
  1662.     btst    #0,d0                * Voix 0
  1663.     beq.s    MuRs0
  1664.     lea    $DFF0A0,a6
  1665.     move.l    a6,MuChip0-MB(a3)
  1666.     move.w    #2,$04(a6)
  1667.     tst.l    VoiInst0(a5)
  1668.     beq.s    MuRs0
  1669.     bset    #0,d3
  1670. MuRs0    btst    #1,d0                * Voix 1
  1671.     beq.s    MuRs1
  1672.     lea    $DFF0B0,a6
  1673.     move.l    a6,MuChip1-MB(a3)
  1674.     move.w    #2,$04(a6)
  1675.     tst.l    VoiInst1(a5)
  1676.     beq.s    MuRs1
  1677.     bset    #1,d3
  1678. MuRs1    btst    #2,d0                * Voix 2
  1679.     beq.s    MuRs2
  1680.     lea    $DFF0C0,a6
  1681.     move.l    a6,MuChip2-MB(a3)
  1682.     move.w    #2,$04(a6)
  1683.     tst.l    VoiInst2(a5)
  1684.     beq.s    MuRs2
  1685.     bset    #2,d3
  1686. MuRs2    btst    #3,d0                * Voix 3
  1687.     beq.s    MuRs3
  1688.     lea    $DFF0D0,a6
  1689.     move.l    a6,MuChip3-MB(a3)
  1690.     move.w    #2,$04(a6)
  1691.     tst.l    VoiInst3(a5)
  1692.     beq.s    MuRs3
  1693.     bset    #3,d3
  1694. MuRs3    clr.w    MuReStart-MB(a3)
  1695.     or.w    d0,MuDMAsk-MB(a3)
  1696.     or.w    d3,MuStop(a5)
  1697. MuRsX    
  1698.     rts
  1699.  
  1700.  
  1701. ***********************************************************
  1702. *    LED INSTRUCTION
  1703. LedOn:
  1704. *******
  1705.     bclr    #1,$BFE001
  1706.     rts
  1707. LedOf:    
  1708. *******
  1709.     bset    #1,$BFE001
  1710.     rts
  1711.  
  1712.  
  1713. ***********************************************************
  1714. *     MUSIC TOKEN TABLE
  1715. *    
  1716. *    This table is the crucial point of the extension! It tells
  1717. *    everything the tokenisatioin process needs to know. You have to 
  1718. *    be carefull when writing it!
  1719. *
  1720. *    The format is simple:
  1721. *    dc.w    Address of instruction-Tk,Address of function-Tk
  1722. *    dc.b    "instruction nam","e"+$80,"Param list",-1[or -2]
  1723. *
  1724. *    1- Address of instr/function
  1725. *        You must state the one that is needed. Just put
  1726. *    a 1 in the function field for an instruction, and in the 
  1727. *    instruction field for a function. Reserved variables need
  1728. *    TWO address!
  1729. *
  1730. *    2- Instruction name
  1731. *        It must be finished by the letter plus $80. Be carefull
  1732. *    ARGASM assembler produces bad code if you do "a"+$80, he wants
  1733. *    $80+"a"!!!
  1734. *        -You can SET A MARK in the token table with a "!" before
  1735. *    the name. See later
  1736. *        -Using a $80 ALONE as a name definition, will force AMOS
  1737. *    to point to the previous "!" mark...
  1738. *    
  1739. *    3- Param list
  1740. *        This list tells AMOS everything about the instruction.
  1741. *
  1742. *    - First character:
  1743. *        The first character defines the TYPE on instruction:
  1744. *            I--> instruction
  1745. *            0--> function that returns a integer
  1746. *            1--> function that returns a float
  1747. *            2--> function that returns a string
  1748. *            V--> reserved variable. In that case, you must
  1749. *                state the type int-float-string
  1750. *    - If your instruction does not need parameters, then you stop
  1751. *    - Your instruction needs parameters, now comes the param list
  1752. *            Type,TypetType,Type...
  1753. *        Type of the parameter (0 1 2)
  1754. *        Comma or "t" for TO
  1755. *
  1756. *    4- End of instruction
  1757. *            "-1" states the end of the instruction
  1758. *            "-2" tells AMOS that another parameter list
  1759. *                 can be accepted. if so, MUST follow the
  1760. *                 complete instruction definition as explained
  1761. *                 but with another param list.
  1762. *    If so, you can use the "!" and $80 facility not to rewrite the
  1763. *    full name of the instruction...See SAM LOOP ON instruction for an
  1764. *    example...
  1765. *
  1766. *    Remember that AMOS token list comes first, so names like:
  1767. *    PRINTHELLO will never work: AMOS will tokenise PRINT first!
  1768. *    Extension token list are explored in order of number...
  1769.  
  1770. *    The next two lines NEED to be there...
  1771. Tk:    dc.w     1,0
  1772.     dc.b     $80,-1
  1773.  
  1774.     dc.w    1,FMB-Tk
  1775.     dc.b    "mubas","e"+$80,"0",-1
  1776.     dc.w    1,FVu-Tk
  1777.     dc.b    "vumete","r"+$80,"00",-1
  1778.     dc.w    IVoice-Tk,1
  1779.     dc.b    "voic","e"+$80,"I0",-1
  1780.     dc.w    IMusOff-Tk,1
  1781.     dc.b    "music of","f"+$80,"I",-1
  1782.     dc.w    IMuStop-Tk,1
  1783.     dc.b    "music sto","p"+$80,"I",-1
  1784.     dc.w    ITempo-Tk,1
  1785.     dc.b    "temp","o"+$80,"I0",-1
  1786.     dc.w    IMusic-Tk,1
  1787.     dc.b    "musi","c"+$80,"I0",-1
  1788.     dc.w    INoTo-Tk,1
  1789.     dc.b    "noise t","o"+$80,"I0",-1
  1790.     dc.w    Boom-Tk,1
  1791.     dc.b     "boo","m"+$80,"I",-1
  1792.     dc.w    Shoot-Tk,1
  1793.     dc.b    "shoo","t"+$80,"I",-1
  1794.     dc.w    ISBank-Tk,1
  1795.     dc.b    "sam ban","k"+$80,"I0",-1
  1796.     dc.w    ISLOn0-Tk,1
  1797.     dc.b    "!sam loop o","n"+$80,"I",-2
  1798.     dc.w    ISLOn1-Tk,1
  1799.     dc.b    $80,"I",-1
  1800.     dc.w    ISLOf0-Tk,1
  1801.     dc.b    "sam loop of","f"+$80,"I",-2
  1802.     dc.w    ISLOf1-Tk,1
  1803.     dc.b    $80,"I0",-1
  1804.     dc.w    ISamTo-Tk,1
  1805.     dc.b    "sampl","e"+$80,"I0t0",-1
  1806.     dc.w     ISam1-Tk,1
  1807.     dc.b     "!sam pla","y"+$80,"I0",-2
  1808.     dc.w    ISam2-Tk,1
  1809.     dc.b    $80,"I0,0",-2
  1810.     dc.w     ISam3-Tk,1
  1811.     dc.b    $80,"I0,0,0",-1 
  1812.     dc.w     ISamR-Tk,1
  1813.     dc.b     "sam ra","w"+$80,"I0,0,0,0",-1    
  1814.     dc.w    Bell0-Tk,1
  1815.     dc.b     "!bel","l"+$80,"I",-2
  1816.     dc.w     Bell1-Tk,1
  1817.     dc.b    $80,"I0",-1
  1818.     dc.w    IPlOf0-Tk,1
  1819.     dc.b    "!play of","f"+$80,"I",-2
  1820.     dc.w    IPlOf1-Tk,1
  1821.     dc.b    $80,"I0",-1
  1822.     dc.w     IPlay2-Tk,1
  1823.     dc.b    "!pla","y"+$80,"I0,0",-2
  1824.     dc.w    IPlay3-Tk,1
  1825.     dc.b    $80,"I0,0,0",-1
  1826.     dc.w     ISWave-Tk,1
  1827.     dc.b     "set wav","e"+$80,"I0,2",-1
  1828.     dc.w    IDWave1-Tk,1
  1829.     dc.b    "del wav","e"+$80,"I0",-1
  1830.     dc.w    ISEnv-Tk,1
  1831.     dc.b    "set enve","l"+$80,"I0,0t0,0",-1
  1832.     dc.w    IMVol-Tk,1
  1833.     dc.b    "mvolum","e"+$80,"I0",-1
  1834.     dc.w     IVol1-Tk,1
  1835.     dc.b    "!volum","e"+$80,"I0",-2
  1836.     dc.w     IVol2-Tk,1
  1837.     dc.b    $80,"I0,0",-1
  1838.     dc.w    IWave-Tk,1
  1839.     dc.b     "wav","e"+$80,"I0t0",-1
  1840.     dc.w    LedOn-Tk,1
  1841.     dc.b    "led o","n"+$80,"I",-1
  1842.     dc.w    LedOf-Tk,1
  1843.     dc.b    "led of","f"+$80,"I",-1
  1844.     dc.w    ISay1-Tk,1
  1845.     dc.b    "!sa","y"+$80,"I2",-2
  1846.     dc.w    ISay2-Tk,1
  1847.     dc.b    $80,"I2,0",-1
  1848.     dc.w    ITalk-Tk,1
  1849.     dc.b    "set tal","k"+$80,"I0,0,0,0",-1
  1850. * You MUST finish the table by a ZERO
  1851.     dc.w     0
  1852.  
  1853. *************** Enveloppes definitions
  1854. *    Be carefull, ARGASM is bugged with __Rs!!!
  1855.         RsReset
  1856. EnvNb:        rs.w    1
  1857. EnvDVol:    rs.w    1
  1858. EnvVol:        rs.l    1
  1859. EnvDelta:    rs.l     1
  1860. EnvAd:        rs.l    1
  1861. EnvDeb:        rs.l    1
  1862. EnvLong:    equ     __Rs
  1863.  
  1864. *************** Wave definition
  1865. LWave:        equ     256+128+64+32+16+8+4+2
  1866. LNoise:        equ     LWave
  1867.         RsReset
  1868. WaveNext:    rs.l    1
  1869. WaveNb:        rs.w    1
  1870. WaveEnv:    rs.w    16*2
  1871. WaveDeb:    rs.b    LWave
  1872. WaveLong:    equ     __Rs
  1873.  
  1874. *************** Music voice data
  1875.         RsReset
  1876. VoiAdr        rs.l    1
  1877. VoiDeb        rs.l    1
  1878. VoiInst        rs.l    1
  1879. VoiDPat        rs.l    1
  1880. VoiPat        rs.l    1
  1881. VoiCpt        rs.w    1
  1882. VoiRep        rs.w    1
  1883. VoiNote        rs.w    1
  1884. VoiDVol        rs.w    1
  1885. VoiVol        rs.w    1
  1886. VoiSlide    rs.w    1
  1887. VoiSlB        rs.w    1
  1888. VoiSlC        rs.w    1        
  1889. VoiLong        equ     __Rs
  1890.  
  1891. *************** MUBASE table
  1892.         RsReset
  1893. * Voix 0
  1894. MuVoix0        equ    __Rs
  1895. VoiAdr0        rs.l    1
  1896. VoiDeb0        rs.l    1
  1897. VoiInst0    rs.l    1
  1898. VoiDPat0    rs.l    1
  1899. VoiPat0        rs.l    1
  1900. VoiCpt0        rs.w    1
  1901. VoiRep0        rs.w    1
  1902. VoiNote0    rs.w    1
  1903. VoiDVol0    rs.w    1
  1904. VoiVol0        rs.w    1
  1905. VoiSlide0    rs.w    1
  1906. VoiSlB0        rs.w    1
  1907. VoiSlC0        rs.w    1        
  1908. * Voix 1
  1909. MuVoix1        equ    __Rs
  1910. VoiAdr1        rs.l    1
  1911. VoiDeb1        rs.l    1
  1912. VoiInst1    rs.l    1
  1913. VoiDPat1    rs.l    1
  1914. VoiPat1        rs.l    1
  1915. VoiCpt1        rs.w    1
  1916. VoiRep1        rs.w    1
  1917. VoiNote1    rs.w    1
  1918. VoiDVol1    rs.w    1
  1919. VoiVol1        rs.w    1
  1920. VoiSlide1    rs.w    1
  1921. VoiSlB1        rs.w    1
  1922. VoiSlC1        rs.w    1        
  1923. * Voix 2
  1924. MuVoix2        equ    __Rs
  1925. VoiAdr2        rs.l    1
  1926. VoiDeb2        rs.l    1
  1927. VoiInst2    rs.l    1
  1928. VoiDPat2    rs.l    1
  1929. VoiPat2        rs.l    1
  1930. VoiCpt2        rs.w    1
  1931. VoiRep2        rs.w    1
  1932. VoiNote2    rs.w    1
  1933. VoiDVol2    rs.w    1
  1934. VoiVol2        rs.w    1
  1935. VoiSlide2    rs.w    1
  1936. VoiSlB2        rs.w    1
  1937. VoiSlC2        rs.w    1        
  1938. * Voix 3
  1939. MuVoix3        equ    __Rs
  1940. VoiAdr3        rs.l    1
  1941. VoiDeb3        rs.l    1
  1942. VoiInst3    rs.l    1
  1943. VoiDPat3    rs.l    1
  1944. VoiPat3        rs.l    1
  1945. VoiCpt3        rs.w    1
  1946. VoiRep3        rs.w    1
  1947. VoiNote3    rs.w    1
  1948. VoiDVol3    rs.w    1
  1949. VoiVol3        rs.w    1
  1950. VoiSlide3    rs.w    1
  1951. VoiSlB3        rs.w    1
  1952. VoiSlC3        rs.w    1        
  1953. * Other data
  1954. MuCpt        rs.w    1
  1955. MuTempo        rs.w    1
  1956. MuStart        rs.w    1
  1957. MuStop        rs.w    1
  1958. * Total length
  1959. MuLong        equ     __Rs
  1960.  
  1961. ***************    MUSIC extension data zone
  1962.         even
  1963. MB:    
  1964. MuVu        dc.l    0        * Vu Meters
  1965. MuBase        dc.l    0        * Curretn music address
  1966. MusAdr        dc.l    0        * Branch table address
  1967. MusClock    dc.l     3546895        * Clock speed
  1968. WaveBase    dc.l    0        * Wave tree
  1969. Waves        dc.w     0,0,0,0
  1970. EnvOn:        dc.w     0        * ADSR running?
  1971. EnvBase:    ds.b    EnvLong*4    * ADSR table
  1972. SamBank:    dc.w     0        * Sample bank
  1973. BSeed:        dc.w     0        * Random seed
  1974. Noise:        dc.w    0        * Noise on?
  1975. PNoise:        dc.w    0        * Pointer to noise buffer
  1976. *         Musique
  1977. MusBank        dc.l     0        * Music bank
  1978. MusCheck    dc.l    0        * Check sum
  1979. BankInst    dc.l    0        * Instruments
  1980. BankSong    dc.l    0        * Songs
  1981. BankPat        dc.l     0        * Patterns
  1982. MuNumber    dc.w    0        * Music priority
  1983. MuVolume    dc.w    0        * Music volume
  1984. MuDMAsk        dc.w    0        * Voice mask
  1985. MuReStart    dc.w    0        * Restart the voice
  1986. MuChip0        dc.l    0        * Circuits 0
  1987. MuChip1        dc.l     0        *       1
  1988. MuChip2        dc.l     0        *          2
  1989. MuChip3        dc.l     0        *          3
  1990. FoEnd        dc.w    $8000        * Fake empty pattern
  1991. MuBuffer    ds.b    MuLong*3    * Music tables
  1992.  
  1993. *************** Default enveloppes
  1994. EnvDef:        dc.w 1,64,4,55,5,50,25,0,0,0
  1995. EnvShoot    dc.w 1,64,10,0,0,0
  1996. EnvBoom        dc.w 1,64,10,50,50,0,0,0
  1997. EnvBell        dc.w 1,64,4,40,25,0,0,0
  1998.  
  1999. *************** Sample enveloppes
  2000. EnvSam        dc.w 1,64,1,64,0,0,0,0
  2001.         dc.w 1,64,1,64,0,0,0,0
  2002.         dc.w 1,64,1,64,0,0,0,0
  2003.         dc.w 1,64,1,64,0,0,0,0
  2004.  
  2005. *************** Bank headers
  2006. BkSam:        dc.b "Samples "
  2007. BkMus:        dc.b "Music   "
  2008.  
  2009. *************** Frequency / notes
  2010. TFreq:    dc.w 000,256/2
  2011.     dc.w 000,256/2
  2012.     dc.w 256,128/2
  2013.     dc.w 384,64/2
  2014.     dc.w 448,32/2
  2015.     dc.w 480,16/2
  2016.     dc.w 496,8/2
  2017.     dc.w 504,4/2
  2018.     dc.w 504,4/2
  2019. TNotes:    dc.w 00,00,00,33,35,37,39,41,44,46,49,52
  2020.     dc.w 55,58,62,65,69,73,78,82,87,92,98,104
  2021.     dc.w 110,117,123,131,139,147,156,165,175,185,196,208
  2022.     dc.w 220,233,247,262,277,294,311,330,349,370,392,415
  2023.     dc.w 440,466,494,523,554,587,622,659,698,740,784,830
  2024.     dc.w 880,932,988,1046,1109,1175,1245,1319,1397,1480,1568,1661
  2025.     dc.w 1760,1865,1986,2093,2217,2349,2489,2637,2794,2960,3136,3322
  2026.     dc.w 3520,3729,3952,4186,4435,4699,4978,5274,5588,5920,6272,6645
  2027.     dc.w 7040,7459,7902,8372
  2028.  
  2029. *************** NARRATOR
  2030. Amaps:        dc.b    3,5,10,12
  2031. TranBase    dc.l    0
  2032. TalkIO:        ds.l    20
  2033. WriteRep:    ds.l    8
  2034. TranName    dc.b    "translator.library",0
  2035. NarDevice    dc.b    "narrator.device",0
  2036.  
  2037. *************** Welcome message
  2038. *        27 Y,position is like locate ,position...
  2039. MusWel:    dc.b     27,"Y8Music player V 1.1",0
  2040.  
  2041. *************** ERROR MESSAGES
  2042. MusErr:    dc.b    "Wave not defined",0            *0
  2043.     dc.b     "Sample not defined",0            *1
  2044.     dc.b     "Sample bank not found",0        *2
  2045.     dc.b    "256 characters for a wave",0        *3
  2046.     dc.b    "Wave 0 and 1 are reserved",0        *4
  2047.     dc.b    "Music bank not found",0        *5
  2048.     dc.b     "Music not defined",0            *6
  2049.     dc.b    "Can't open narrator",0            *7
  2050.  
  2051. *************** That's it!
  2052.     dc.l    0
  2053.  
  2054.  
  2055.